package com.learn.english.mapper;

import com.learn.english.model.entity.User;
import org.apache.ibatis.annotations.*;

import java.time.LocalDateTime;
import java.util.List;

/**
 * @author TISNIW
 * @version 1.0
 * @date 2024/9/20 9:05
 * @desc
 */
@Mapper
public interface UserMapper {

    // ===================== 用户登录与注册相关 =====================

    /**
     * 根据用户名查询用户信息（用于注册查询）
     */
    @Select("select * from users where username = #{username}")
    User queryByUsername(String username);
    /**
     * 根据用户UID查询用户信息（用于登录）
     */
    @Select("select * from users where uid = #{uid}")
    User queryByUid(String uid);

    /**
     * 根据邮箱查询用户信息（用于注册或找回密码）
     */
    @Select("select * from users where email = #{email}")
    User queryByEmail(String email);

    /**
     * 注册新用户
     */
    @Insert("insert into users" +
            "(id, username, uid, password, email, avatar_url) values" +
            "(#{id}, #{username}, #{uid}, #{password}, #{email}, #{avatarUrl})")
    Integer addUser(User user);

    // ===================== 用户信息管理 =====================

    /**
     * 根据用户ID查询用户详细信息
     */
    @Select("select * from users where id = #{id}")
    User queryById(Integer id);

    /**
     * 更新用户基础信息（如昵称、头像、手机号等）
     */
    Integer updateUser(User user);

    /**
     * 更新用户密码
     */
    @Update("update users set password = #{password} where id = #{id}")
    Integer updatePassword(@Param("id") Integer id, @Param("password") String password);

    /**
     * 更新用户的最后登录时间
     */
    @Update("update users set last_login_time = #{loginTime} where id = #{id}")
    Integer updateLastLoginInfo(@Param("id") Integer id,
                                @Param("loginTime") LocalDateTime loginTime);

    /**
     * 软删除用户（将状态设为已删除）
     */
    @Update("update users set is_deleted = 1 where id = #{id}")
    Integer softDeleteUser(Integer id);

    // ===================== 管理端功能 =====================

    /**
     * 查询所有用户数量（支持条件筛选时可加参数）
     */
    @Select("select count(*) from users")
    Integer queryUserCount();

    /**
     * 分页查询用户列表（管理后台用）
     */
    @Select("select * from users limit #{offset}, #{pageSize}")
    List<User> queryUserListByPage(@Param("offset") int offset,
                                   @Param("pageSize") int pageSize);

    /**
     * 根据条件筛选用户（如用户名模糊搜索、角色、状态等）
     */
    @Select("select * from users where uid like concat('%', #{uid}, '%')" +
            " and role = #{role} and status = #{status}")
    List<User> queryUsersByCondition(@Param("uid") String uid,
                                     @Param("role") String role,
                                     @Param("status") Integer status);

    /**
     * 批量删除用户（软删除）
     */
    @Update("update users set is_deleted = 1 where id in " +
            "(<foreach collection='ids' item='id' separator=','>#{id}</foreach>)")
    Integer deleteUsersByIds(@Param("ids") List<Integer> ids);

    /**
     * 启用/禁用用户账户
     */
    @Update("update users set status = #{status} where id = #{id}")
    Integer updateUserStatus(@Param("id") Integer id, @Param("status") Integer status);

    // ===================== 其他辅助功能 =====================

    /**
     * 获取当前用户表的最大ID（用于生成用户uid）
     */
    @Select("SELECT MAX(id) FROM users")
    Integer queryMaxId();
}
